/*
 * Copyright (c) 2021，上海福宇龙汽车科技有限公司
 * All rights reserved.
 * 文件名称: lock_loop.h
 * 摘要:
 * 当前版本: V1.0.0 zhouwei
 * Date: 2024-04-22
 * 历史版本: Vx.x.x，编写者/修改者，修改时间，修改内容（重大发布时，总结重点变更内容）
 */
#ifndef _LOCK_LOOP_H
#define _LOCK_LOOP_H
#include "lock_uart.h"

#define LOCK_NUM 20U
#define LOCK_DLY 1500U
#define TIME_3S 3000U
typedef enum 
{
    LOOP_INIT,           /*初始化为解锁状态*/
    LOOP_DURING_TEST,    /*测试中*/
    LOOP_EX_EOL_MOD,     /*正在退出EOL模式中*/
    LOOP_NOT_MAX         /*未开始测试*/
}lock_loop_status;/*当前测试状态*/

typedef enum 
{
    QUERY_IN_PROGRESS,  /*正在查询*/
    RESETTING_IN_PROGRESS,/*正在复位*/
    LOCK_QUER_MAX
}lock_query_status;

typedef enum 
{
    LOOP_RSP_ERR,        /*锁回复错误*/
    LOOP_TIMEOUT_ERR     /*超时错误*/
}lock_loop_error;/*循环测试失败原因*/

typedef struct
{
    bool start_keyStableState; /*启动按键稳定状态标志或只发送一次标志*/
    bool cycle_3s;             /*3s内只进行一次循环标志*/
    uint32_t time_3s;          /* 3s计时 */
    uint32_t count;             /* 测试次数 */
    lock_loop_status t_st;          /* 测试状态 */
    lock_query_status q_st;     /* 查询状态 */
    Is_locked locked;          /* 锁状态 */
    Is_locked query_locked;    /* 查询锁状态 */
    Lock_test_data Tx;         /*Test_Fixture请求帧*/
    Sent_received_flag Tflag;  /*Test_Fixture请求帧串口发送标志*/
    Lock_test_data Rx;         /*EHBL应答帧*/
    Sent_received_flag Rflag;  /*EHBL应答帧串口接受标志*/
    Rt_result e_sta[LOOP_NOT_MAX]; /*各阶段具体结果情况*/
    Rt_result LOOP_results;    /*测试步骤是否流程走完*/
} lock_loop_data;

/**
 * @brief 用于处理锁循环的UART回调函数
 *
 * 此函数在接收到特定的UART命令后，会更新内部的锁定数据状态。
 *
 * @param cmd 接收到的UART命令的16位编码
 * @param data 通过UART接收到的数据数组，数组中包含具体的锁定操作数据
 */
void lock_loop_uartcb(uint16_t cmd, uint8_t data[]);

/**
 * 初始化锁循环状态
 *
 * 该函数用于初始化一个全局的锁状态数据结构，将锁设置为未锁定状态，并准备好等待线程来获取锁。
 * 初始化包括设置开始键稳定状态、锁计数、测试状态和锁的状态。
 * 参数:无
 * 返回值:无
 */
void lock_loop_init(void);

/**
 * 主循环锁定函数
 * 该函数初始化手动重置检测，启动循环开始按钮，并进入锁定循环。
 *
 * 参数: 无
 * 返回值: 无
 */
void lock_loop_main(void);

Rt_result loop_initunlock(void);
Rt_result loop_unlock_lock(void);
Rt_result loop_ex_eol(void);
#endif
